class PrintController < ApplicationController
  require 'CSV'

  
  def csv
    @test = Print.new
    @test.calculate(Parcelle)
#    print ("\n\nname ok : "+@test.Parcelles[1][:name].to_s)
    @test.write_csv
  end

  def test
    @parcelles = Parcelle.find(:all)
    @labours = Labour.find(:all)
    @pulves = Pulve.find(:all)
    @factures = Facture.find(:all, :order => "category_id")
    @types = Category.find_all_by_upcategory_id(Upcategory.find_by_name('facture'))
    
    @cols = Zone.find(:all)

    @test = Print.new
    @test.calculate(Parcelle)

##Parcelles
#    @test.init_cols(Parcelle)
#    @test.init_factures(Parcelle)
#    @test.init_pulves(Parcelle)
#    @test.init_labours(Parcelle)
#
#    @test.run_labours(Parcelle)
#    @test.run_pulves(Parcelle)
#    @test.run_factures(Parcelle)
#
#    @test.run_totaux(Parcelle)
#    
##Zones
#    @test.init_cols(Zone)
#    @test.init_factures(Zone)
#    @test.init_pulves(Zone)
#    @test.init_labours(Zone)
#
#    @test.run_labours(Zone)
#    @test.run_pulves(Zone)
#    @test.run_factures(Zone)
#    @test.run_totaux(Zone)

    respond_to do |format|
      format.html # index.html.erb
    end
  end  
  
  
  def parcelles
    
 #   @parcelles = Parcelle.find(:all, :order => "typeculture_id")
    @parcelles = Parcelle.find(:all)
    @labours = Labour.find(:all)
    @pulves = Pulve.find(:all)
    @factures = Facture.find(:all, :order => "category_id")
    @types = Category.find_all_by_upcategory_id(Upcategory.find_by_name('facture'))
    rang = 0    
    
  #Init Hparcelles 
    @Pparcelles = {}
    for parcelle in @parcelles
      @Pparcelles[:cout_total] = 0   # derniere case somme de tout les totaux
      @Pparcelles[:cout_ha] = 0   # derniere case somme de tout les totaux ha
      @Pparcelles[parcelle.id] = {}
      @Pparcelles[parcelle.id] = {:pulves => {}, :labours => {}, :factures => {}, :total => {} }
      @Pparcelles[parcelle.id][:total][:cout_ha] = {}
      @Pparcelles[parcelle.id][:total][:cout_total] = {}
      @Pparcelles[parcelle.id][:factures][:cout_ha] = {}
      @Pparcelles[parcelle.id][:factures][:cout_total] = {}
      
      rang += 1
      @Pparcelles[parcelle.id][:rang] = rang  
      @Pparcelles[parcelle.id][:labours][:cout_ha] = 0
      @Pparcelles[parcelle.id][:labours][:cout_total] = 0
      @Pparcelles[parcelle.id][:pulves][:cout_ha] = 0
      @Pparcelles[parcelle.id][:pulves][:cout_total] = 0
      
      @Pparcelles[parcelle.id][:factures][:cout_total][:sum] = 0  
      @Pparcelles[parcelle.id][:factures][:cout_ha][:sum] = 0  
      @Pparcelles[parcelle.id][:total][:cout_total][:sum] = 0  
      @Pparcelles[parcelle.id][:total][:cout_ha][:sum] = 0  

      for type in @types
        @Pparcelles[parcelle.id][:factures][:cout_total][type.name] = 0  
        @Pparcelles[parcelle.id][:factures][:cout_ha][type.name] = 0  
        @Pparcelles[parcelle.id][:total][:cout_total][type.name] = 0  
        @Pparcelles[parcelle.id][:total][:cout_ha][type.name] = 0  
      end
    end
    #@Pparcelles[:total][:sum_total] = 0
    
  #Init Hlabours 
    @Plabours = Hash.new()
    @Plabours[:cout_total] = 0
    @Plabours[:cout_ha_total] = 0
    for labour in @labours
      @Plabours[labour.id] = {:parcelles => {}, :id => labour.id, :name => labour.name, :cout_total => (labour.cout_ha_passage * 10), :cout_ha_passage => labour.cout_ha_passage}
      for parcelle in @parcelles
        hparcelles = {:name => parcelle.name, :surface => parcelle.surface }  
        @Plabours[labour.id][:parcelles].store(parcelle.id, hparcelles)
        @Plabours[labour.id][parcelle.id] = {:cout_ha => 0, :cout_total => 0 }
      end
    end

  #Init Hpulve 
    @Ppulves = Hash.new()
    @Ppulves[:cout_total] = 0
    @Ppulves[:cout_ha_total] = 0
    for pulve in @pulves
      @Ppulves[pulve.id] = {:parcelles => {}, :id => pulve.id, :name => pulve.name, :cout_total => (pulve.cout_ha_passage * 10), :cout_ha_passage => pulve.cout_ha_passage}
      for parcelle in @parcelles
        hparcelles = {:name => parcelle.name, :surface => parcelle.surface }  
        @Ppulves[pulve.id][:parcelles].store(parcelle.id, hparcelles)
        @Ppulves[pulve.id][parcelle.id] = {:cout_ha => 0, :cout_total => 0 }
      end
    end

  #Init Hfactures 
    @Pfactures = Hash.new()
    @Pfactures[:cout_total] = Hash.new()
    @Pfactures[:cout_ha] = Hash.new()
    
    for facture in @factures
      @Pfactures[facture.id] = {:parcelles => {}, :id => facture.id, :name => facture.name, :cout => facture.cout }
      #for parcelle in facture.parcelles
      for parcelle in @parcelles
        hparcelles = {:name => parcelle.name, :surface => parcelle.surface }  
        @Pfactures[facture.id][:parcelles].store(parcelle.id, hparcelles)
        @Pfactures[facture.id][parcelle.id] = {:cout_ha => 0, :cout_total => 0 , :cout_sans_charges => 0 }

        @Pfactures[facture.id][:cout_total] = 0 
        @Pfactures[facture.id][:cout_ha] = 0 
        @Pfactures[:cout_total][:sum] = 0 
        @Pfactures[:cout_ha][:sum] = 0 
        
        for type in @types
          @Pfactures[:cout_total][type.name] = 0 
          @Pfactures[:cout_ha][type.name] = 0 
        end
      end
    end


  #LABOUR
    for labour in @labours
      for parcelle in @parcelles
        #valeur ha et total pour chaque parcelle affecté a la labour
        cout_ha = labour.get_cout_ha_parcelle(parcelle)
        cout_total = labour.get_cout_total_parcelle(parcelle)
        @Plabours[labour.id][parcelle.id][:cout_ha] = cout_ha
        @Plabours[labour.id][parcelle.id][:cout_total] = cout_total
      end
 
      @Plabours[labour.id][:parcelles_size] = @Plabours[labour.id][:parcelles].length      
      @Plabours[labour.id][:cout_ha_total] = labour.get_cout_ha
      @Plabours[labour.id][:cout_total] = labour.get_cout_total
      @Plabours[labour.id][:surface_total] = labour.sum_surfaces
      #total labour
      @Plabours[:cout_total] += @Plabours[labour.id][:cout_total]
      @Plabours[:cout_ha_total] += @Plabours[labour.id][:cout_ha_total]
    end
  
  
  #PULVES
    for pulve in @pulves
      for parcelle in @parcelles
        #valeur ha et total pour chaque parcelle affecté a la pulve
        cout_ha = pulve.get_cout_ha_parcelle(parcelle)
        cout_total = pulve.get_cout_total_parcelle(parcelle)
        @Ppulves[pulve.id][parcelle.id][:cout_ha] = cout_ha
        @Ppulves[pulve.id][parcelle.id][:cout_total] = cout_total
      end
 
      @Ppulves[pulve.id][:parcelles_size] = @Ppulves[pulve.id][:parcelles].length      
      @Ppulves[pulve.id][:cout_ha_produit] = pulve.get_cout_ha_produit
      @Ppulves[pulve.id][:cout_ha_passage] = pulve.cout_ha_passage
      @Ppulves[pulve.id][:cout_ha_total] = pulve.get_cout_ha
      @Ppulves[pulve.id][:cout_total] = pulve.get_cout_total
      @Ppulves[pulve.id][:surface_total] = pulve.sum_surfaces
      #total pulve
      @Ppulves[:cout_total] += @Ppulves[pulve.id][:cout_total]
      @Ppulves[:cout_ha_total] += @Ppulves[pulve.id][:cout_ha_total]
    end
  
  #FACTURES
    for facture in @factures
      for parcelle in @parcelles
        #valeur ha et total pour chaque parcelle
        cout_ha = facture.get_cout_ha_parcelle(parcelle)
        cout_total = facture.get_cout_total_parcelle(parcelle)
        @Pfactures[facture.id][parcelle.id][:cout_ha] = cout_ha
        @Pfactures[facture.id][parcelle.id][:cout_total] = cout_total
      end
      
      total_ha = facture.get_cout_ha
      total = facture.get_cout_total
      @Pfactures[facture.id][:category] = facture.category.name
      @Pfactures[facture.id][:parcelles_size] = @Pfactures[facture.id][:parcelles].length
      @Pfactures[facture.id][:surface_total] = facture.sum_surfaces
      
      #total de la facture
      @Pfactures[facture.id][:cout_total] = total
      @Pfactures[facture.id][:cout_ha] = total_ha
      
      #total des factures
      @Pfactures[:cout_total][:sum] += total
      @Pfactures[:cout_ha][:sum] += total_ha
      
      #totaux par types de factures
      for type in @types
        if (@Pfactures[facture.id][:category].to_s == type.name)
          @Pfactures[:cout_total][type.name] += total
          @Pfactures[:cout_ha][type.name] += total_ha
        end
      end
    end
  

  #TOTAUX PAR PARCELLES
  
    for labour in @labours
      for parcelle in @parcelles
        cout_ha = @Plabours[labour.id][parcelle.id][:cout_ha]
        cout_total = @Plabours[labour.id][parcelle.id][:cout_total]
      
      #somme des labours par parcelle
        @Pparcelles[parcelle.id][:labours][:cout_ha] += cout_ha
        @Pparcelles[parcelle.id][:labours][:cout_total] += cout_total
     
      #total des couts par parcelle
        @Pparcelles[parcelle.id][:total][:cout_ha][:sum] += cout_ha
        @Pparcelles[parcelle.id][:total][:cout_total][:sum] += cout_total
      end
    end
    
    for pulve in @pulves
      for parcelle in @parcelles
        cout_ha = @Ppulves[pulve.id][parcelle.id][:cout_ha]
        cout_total = @Ppulves[pulve.id][parcelle.id][:cout_total]
      
      #somme des pulves par parcelle
        @Pparcelles[parcelle.id][:pulves][:cout_ha] += cout_ha
        @Pparcelles[parcelle.id][:pulves][:cout_total] += cout_total
     
      #total des couts par parcelle
        @Pparcelles[parcelle.id][:total][:cout_ha][:sum] += cout_ha
        @Pparcelles[parcelle.id][:total][:cout_total][:sum] += cout_total
      end

    end
    
    for facture in @factures
      for parcelle in @parcelles
        cout_ha = @Pfactures[facture.id][parcelle.id][:cout_ha]
        cout_total = @Pfactures[facture.id][parcelle.id][:cout_total]
      
        #somme des factures par parcelle
        @Pparcelles[parcelle.id][:factures][:cout_ha][:sum] += cout_ha
        @Pparcelles[parcelle.id][:factures][:cout_total][:sum] += cout_total
      
        #total des couts par parcelle
        @Pparcelles[parcelle.id][:total][:cout_ha][:sum] += cout_ha
        @Pparcelles[parcelle.id][:total][:cout_total][:sum] += cout_total
        
        for type in @types
          if (@Pfactures[facture.id][:category].to_s == type.name)
            @Pparcelles[parcelle.id][:total][:cout_ha][type.name] += cout_ha
            @Pparcelles[parcelle.id][:total][:cout_total][type.name] += cout_total
          end
        end
      end    
    end

#SOMME DES TOTAUX
    for parcelle in @parcelles
      @Pparcelles[:cout_total] += @Pparcelles[parcelle.id][:total][:cout_total][:sum]
      @Pparcelles[:cout_ha] += @Pparcelles[parcelle.id][:total][:cout_ha][:sum]
    end    
    
  #AFFICHAGE   
    respond_to do |format|
      format.html 
      format.xml  { render :xml => @factures }
    end
  end



  def zones
    @parcelles = Zone.find(:all)
    @labours = Labour.find(:all)
    @pulves = Pulve.find(:all)
    @factures = Facture.find(:all, :order => "category_id")
    @types = Category.find_all_by_upcategory_id(Upcategory.find_by_name('facture'))
    rang = 0    
    
  #Init Hparcelles 
    @Pparcelles = {}
    for parcelle in @parcelles
      @Pparcelles[:cout_total] = 0   # derniere case somme de tout les totaux
      @Pparcelles[:cout_ha] = 0   # derniere case somme de tout les totaux ha
      @Pparcelles[parcelle.id] = {}
      @Pparcelles[parcelle.id] = {:pulves => {}, :labours => {}, :factures => {}, :total => {} }
      @Pparcelles[parcelle.id][:total][:cout_ha] = {}
      @Pparcelles[parcelle.id][:total][:cout_total] = {}
      @Pparcelles[parcelle.id][:factures][:cout_ha] = {}
      @Pparcelles[parcelle.id][:factures][:cout_total] = {}
      
      rang += 1
      @Pparcelles[parcelle.id][:rang] = rang  
      @Pparcelles[parcelle.id][:labours][:cout_ha] = 0
      @Pparcelles[parcelle.id][:labours][:cout_total] = 0
      @Pparcelles[parcelle.id][:pulves][:cout_ha] = 0
      @Pparcelles[parcelle.id][:pulves][:cout_total] = 0
      
      @Pparcelles[parcelle.id][:factures][:cout_total][:sum] = 0  
      @Pparcelles[parcelle.id][:factures][:cout_ha][:sum] = 0  
      @Pparcelles[parcelle.id][:total][:cout_total][:sum] = 0  
      @Pparcelles[parcelle.id][:total][:cout_ha][:sum] = 0  

      for type in @types
        @Pparcelles[parcelle.id][:factures][:cout_total][type.name] = 0  
        @Pparcelles[parcelle.id][:factures][:cout_ha][type.name] = 0  
        @Pparcelles[parcelle.id][:total][:cout_total][type.name] = 0  
        @Pparcelles[parcelle.id][:total][:cout_ha][type.name] = 0  
      end
    end
    #@Pparcelles[:total][:sum_total] = 0
    
  #Init Hlabours 
    @Plabours = Hash.new()
    @Plabours[:cout_total] = 0
    @Plabours[:cout_ha_total] = 0
    for labour in @labours
      @Plabours[labour.id] = {:parcelles => {}, :id => labour.id, :name => labour.name, :cout_total => (labour.cout_ha_passage * 10), :cout_ha_passage => labour.cout_ha_passage}
      for parcelle in @parcelles
        hparcelles = {:name => parcelle.name, :surface => parcelle.surface }  
        @Plabours[labour.id][:parcelles].store(parcelle.id, hparcelles)
        @Plabours[labour.id][parcelle.id] = {:cout_ha => 0, :cout_total => 0 }
      end
    end

  #Init Hpulve 
    @Ppulves = Hash.new()
    @Ppulves[:cout_total] = 0
    @Ppulves[:cout_ha_total] = 0
    for pulve in @pulves
      @Ppulves[pulve.id] = {:parcelles => {}, :id => pulve.id, :name => pulve.name, :cout_total => (pulve.cout_ha_passage * 10), :cout_ha_passage => pulve.cout_ha_passage}
      for parcelle in @parcelles
        hparcelles = {:name => parcelle.name, :surface => parcelle.surface }  
        @Ppulves[pulve.id][:parcelles].store(parcelle.id, hparcelles)
        @Ppulves[pulve.id][parcelle.id] = {:cout_ha => 0, :cout_total => 0 }
      end
  end
  
  #Init Hfactures 
    @Pfactures = Hash.new()
    @Pfactures[:cout_total] = Hash.new()
    @Pfactures[:cout_ha] = Hash.new()
    
    for facture in @factures
      @Pfactures[facture.id] = {:parcelles => {}, :id => facture.id, :name => facture.name, :cout => facture.cout }
      #for parcelle in facture.parcelles
      for parcelle in @parcelles
        hparcelles = {:name => parcelle.name, :surface => parcelle.surface }  
        @Pfactures[facture.id][:parcelles].store(parcelle.id, hparcelles)
        @Pfactures[facture.id][parcelle.id] = {:cout_ha => 0, :cout_total => 0 , :cout_sans_charges => 0 }

        @Pfactures[facture.id][:cout_total] = 0 
        @Pfactures[facture.id][:cout_ha] = 0 
        @Pfactures[:cout_total][:sum] = 0 
        @Pfactures[:cout_ha][:sum] = 0 
        
        for type in @types
          @Pfactures[:cout_total][type.name] = 0 
          @Pfactures[:cout_ha][type.name] = 0 
        end
      end
    end

  #LABOUR
    for labour in @labours
      for parcelle in @parcelles
        #valeur ha et total pour chaque parcelle affecté a la labour
        cout_ha = labour.get_cout_ha_zone(parcelle)
        cout_total = labour.get_cout_total_zone(parcelle)
        @Plabours[labour.id][parcelle.id][:cout_ha] = cout_ha
        @Plabours[labour.id][parcelle.id][:cout_total] = cout_total
      end
 
      @Plabours[labour.id][:parcelles_size] = @Plabours[labour.id][:parcelles].length      
      @Plabours[labour.id][:cout_ha_total] = labour.get_cout_ha
      @Plabours[labour.id][:cout_total] = labour.get_cout_total
      @Plabours[labour.id][:surface_total] = labour.sum_surfaces
      #total labour
      @Plabours[:cout_total] += @Plabours[labour.id][:cout_total]
      @Plabours[:cout_ha_total] += @Plabours[labour.id][:cout_ha_total]
    end
  
  
  #PULVES
    for pulve in @pulves
      for parcelle in @parcelles
        #valeur ha et total pour chaque parcelle affecté a la pulve
        cout_ha = pulve.get_cout_ha_zone(parcelle)
        cout_total = pulve.get_cout_total_zone(parcelle)
        @Ppulves[pulve.id][parcelle.id][:cout_ha] = cout_ha
        @Ppulves[pulve.id][parcelle.id][:cout_total] = cout_total
      end
 
      @Ppulves[pulve.id][:parcelles_size] = @Ppulves[pulve.id][:parcelles].length      
      @Ppulves[pulve.id][:cout_ha_produit] = pulve.get_cout_ha_produit
      @Ppulves[pulve.id][:cout_ha_passage] = pulve.cout_ha_passage
      @Ppulves[pulve.id][:cout_ha_total] = pulve.get_cout_ha
      @Ppulves[pulve.id][:cout_total] = pulve.get_cout_total
      @Ppulves[pulve.id][:surface_total] = pulve.sum_surfaces
      #total pulve
      @Ppulves[:cout_total] += @Ppulves[pulve.id][:cout_total]
      @Ppulves[:cout_ha_total] += @Ppulves[pulve.id][:cout_ha_total]
    end
  
  #FACTURES
    for facture in @factures
      for parcelle in @parcelles
        #valeur ha et total pour chaque parcelle
        cout_ha = facture.get_cout_ha_zone(parcelle)
        cout_total = facture.get_cout_total_zone(parcelle)
        @Pfactures[facture.id][parcelle.id][:cout_ha] = cout_ha
        @Pfactures[facture.id][parcelle.id][:cout_total] = cout_total
      end
      
      total_ha = facture.get_cout_ha
      total = facture.get_cout_total
      @Pfactures[facture.id][:category] = facture.category.name
      @Pfactures[facture.id][:parcelles_size] = @Pfactures[facture.id][:parcelles].length
      @Pfactures[facture.id][:surface_total] = facture.sum_surfaces
      
      #total de la facture
      @Pfactures[facture.id][:cout_total] = total
      @Pfactures[facture.id][:cout_ha] = total_ha
      
      #total des factures
      @Pfactures[:cout_total][:sum] += total
      @Pfactures[:cout_ha][:sum] += total_ha
      
      #totaux par types de factures
      for type in @types
        if (@Pfactures[facture.id][:category].to_s == type.name)
          @Pfactures[:cout_total][type.name] += total
          @Pfactures[:cout_ha][type.name] += total_ha
        end
      end
    end
  
  #TOTAUX PAR PARCELLES
  
    for labour in @labours
      for parcelle in @parcelles
        cout_ha = @Plabours[labour.id][parcelle.id][:cout_ha]
        cout_total = @Plabours[labour.id][parcelle.id][:cout_total]
      
      #somme des labours par parcelle
        @Pparcelles[parcelle.id][:labours][:cout_ha] += cout_ha
        @Pparcelles[parcelle.id][:labours][:cout_total] += cout_total
     
      #total des couts par parcelle
        @Pparcelles[parcelle.id][:total][:cout_ha][:sum] += cout_ha
        @Pparcelles[parcelle.id][:total][:cout_total][:sum] += cout_total
      end
    end
    
    for pulve in @pulves
      for parcelle in @parcelles
        cout_ha = @Ppulves[pulve.id][parcelle.id][:cout_ha]
        cout_total = @Ppulves[pulve.id][parcelle.id][:cout_total]
      
      #somme des pulves par parcelle
        @Pparcelles[parcelle.id][:pulves][:cout_ha] += cout_ha
        @Pparcelles[parcelle.id][:pulves][:cout_total] += cout_total
     
      #total des couts par parcelle
        @Pparcelles[parcelle.id][:total][:cout_ha][:sum] += cout_ha
        @Pparcelles[parcelle.id][:total][:cout_total][:sum] += cout_total
      end
    end
    
    for facture in @factures
      for parcelle in @parcelles
        cout_ha = @Pfactures[facture.id][parcelle.id][:cout_ha]
        cout_total = @Pfactures[facture.id][parcelle.id][:cout_total]
      
        #somme des factures par parcelle
        @Pparcelles[parcelle.id][:factures][:cout_ha][:sum] += cout_ha
        @Pparcelles[parcelle.id][:factures][:cout_total][:sum] += cout_total
      
        #total des couts par parcelle
        @Pparcelles[parcelle.id][:total][:cout_ha][:sum] += cout_ha
        @Pparcelles[parcelle.id][:total][:cout_total][:sum] += cout_total
        
        for type in @types
          if (@Pfactures[facture.id][:category].to_s == type.name)
            @Pparcelles[parcelle.id][:total][:cout_ha][type.name] += cout_ha
            @Pparcelles[parcelle.id][:total][:cout_total][type.name] += cout_total
          end
        end
      end    
    end

#SOMME DES TOTAUX
    for parcelle in @parcelles
      @Pparcelles[:cout_total] += @Pparcelles[parcelle.id][:total][:cout_total][:sum]
      @Pparcelles[:cout_ha] += @Pparcelles[parcelle.id][:total][:cout_ha][:sum]
    end    
    
  #AFFICHAGE   
    respond_to do |format|
      format.html 
      format.xml  { render :xml => @factures }
    end
  end
  
end
